#pragma once
#include <map>
#include <string_view>

namespace cinatra {
static const std::map<std::string_view, std::string_view, ci_less> mime_map = {
    {".323", "text/h323"},
    {".3gp", "video/3gpp"},
    {".aab", "application/x-authoware-bin"},
    {".aam", "application/x-authoware-map"},
    {".aas", "application/x-authoware-seg"},
    {".acx", "application/internet-property-stream"},
    {".ai", "application/postscript"},
    {".aif", "audio/x-aiff"},
    {".aifc", "audio/x-aiff"},
    {".aiff", "audio/x-aiff"},
    {".als", "audio/X-Alpha5"},
    {".amc", "application/x-mpeg"},
    {".ani", "application/octet-stream"},
    {".apk", "application/vnd.android.package-archive"},
    {".asc", "text/plain"},
    {".asd", "application/astound"},
    {".asf", "video/x-ms-asf"},
    {".asn", "application/astound"},
    {".asp", "application/x-asap"},
    {".asr", "video/x-ms-asf"},
    {".asx", "video/x-ms-asf"},
    {".au", "audio/basic"},
    {".avb", "application/octet-stream"},
    {".avi", "video/x-msvideo"},
    {".awb", "audio/amr-wb"},
    {".axs", "application/olescript"},
    {".bas", "text/plain"},
    {".bcpio", "application/x-bcpio"},
    {".bin ", "application/octet-stream"},
    {".bld", "application/bld"},
    {".bld2", "application/bld2"},
    {".bmp", "image/bmp"},
    {".bpk", "application/octet-stream"},
    {".bz2", "application/x-bzip2"},
    {".c", "text/plain"},
    {".cal", "image/x-cals"},
    {".cat", "application/vnd.ms-pkiseccat"},
    {".ccn", "application/x-cnc"},
    {".cco", "application/x-cocoa"},
    {".cdf", "application/x-cdf"},
    {".cer", "application/x-x509-ca-cert"},
    {".cgi", "magnus-internal/cgi"},
    {".chat", "application/x-chat"},
    {".class", "application/octet-stream"},
    {".clp", "application/x-msclip"},
    {".cmx", "image/x-cmx"},
    {".co", "application/x-cult3d-object"},
    {".cod", "image/cis-cod"},
    {".conf", "text/plain"},
    {".cpio", "application/x-cpio"},
    {".cpp", "text/plain"},
    {".cpt", "application/mac-compactpro"},
    {".crd", "application/x-mscardfile"},
    {".crl", "application/pkix-crl"},
    {".crt", "application/x-x509-ca-cert"},
    {".csh", "application/x-csh"},
    {".csm", "chemical/x-csml"},
    {".csml", "chemical/x-csml"},
    {".css", "text/css"},
    {".cur", "application/octet-stream"},
    {".dcm", "x-lml/x-evm"},
    {".dcr", "application/x-director"},
    {".dcx", "image/x-dcx"},
    {".der", "application/x-x509-ca-cert"},
    {".dhtml", "text/html"},
    {".dir", "application/x-director"},
    {".dll", "application/x-msdownload"},
    {".dmg", "application/octet-stream"},
    {".dms", "application/octet-stream"},
    {".doc", "application/msword"},
    {".docx",
     "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
    {".dot", "application/msword"},
    {".dvi", "application/x-dvi"},
    {".dwf", "drawing/x-dwf"},
    {".dwg", "application/x-autocad"},
    {".dxf", "application/x-autocad"},
    {".dxr", "application/x-director"},
    {".ebk", "application/x-expandedbook"},
    {".emb", "chemical/x-embl-dl-nucleotide"},
    {".embl", "chemical/x-embl-dl-nucleotide"},
    {".eps", "application/postscript"},
    {".epub", "application/epub+zip"},
    {".eri", "image/x-eri"},
    {".es", "audio/echospeech"},
    {".esl", "audio/echospeech"},
    {".etc", "application/x-earthtime"},
    {".etx", "text/x-setext"},
    {".evm", "x-lml/x-evm"},
    {".evy", "application/envoy"},
    {".exe", "application/octet-stream"},
    {".fh4", "image/x-freehand"},
    {".fh5", "image/x-freehand"},
    {".fhc", "image/x-freehand"},
    {".fif", "application/fractals"},
    {".flr", "x-world/x-vrml"},
    {".flv", "flv-application/octet-stream"},
    {".fm", "application/x-maker"},
    {".fpx", "image/x-fpx"},
    {".fvi", "video/isivideo"},
    {".gau", "chemical/x-gaussian-input"},
    {".gca", "application/x-gca-compressed"},
    {".gdb", "x-lml/x-gdb"},
    {".gif", "image/gif"},
    {".gps", "application/x-gps"},
    {".gtar", "application/x-gtar"},
    {".gz", "application/x-gzip"},
    {".h", "text/plain"},
    {".hdf", "application/x-hdf"},
    {".hdm", "text/x-hdml"},
    {".hdml", "text/x-hdml"},
    {".hlp", "application/winhlp"},
    {".hqx", "application/mac-binhex40"},
    {".hta", "application/hta"},
    {".htc", "text/x-component"},
    {".htm", "text/html"},
    {".html", "text/html"},
    {".hts", "text/html"},
    {".htt", "text/webviewhtml"},
    {".ice", "x-conference/x-cooltalk"},
    {".ico", "image/x-icon"},
    {".ief", "image/ief"},
    {".ifm", "image/gif"},
    {".ifs", "image/ifs"},
    {".iii", "application/x-iphone"},
    {".imy", "audio/melody"},
    {".ins", "application/x-internet-signup"},
    {".ips", "application/x-ipscript"},
    {".ipx", "application/x-ipix"},
    {".isp", "application/x-internet-signup"},
    {".it", "audio/x-mod"},
    {".itz", "audio/x-mod"},
    {".ivr", "i-world/i-vrml"},
    {".j2k", "image/j2k"},
    {".jad", "text/vnd.sun.j2me.app-descriptor"},
    {".jam", "application/x-jam"},
    {".jar", "application/java-archive"},
    {".java", "text/plain"},
    {".jfif", "image/pipeg"},
    {".jnlp", "application/x-java-jnlp-file"},
    {".jpe", "image/jpeg"},
    {".jpeg", "image/jpeg"},
    {".jpg", "image/jpeg"},
    {".jpz", "image/jpeg"},
    {".js", "application/x-javascript"},
    {".jwc", "application/jwc"},
    {".kjx", "application/x-kjx"},
    {".lak", "x-lml/x-lak"},
    {".latex", "application/x-latex"},
    {".lcc", "application/fastman"},
    {".lcl", "application/x-digitalloca"},
    {".lcr", "application/x-digitalloca"},
    {".lgh", "application/lgh"},
    {".lha", "application/octet-stream"},
    {".lml", "x-lml/x-lml"},
    {".lmlpack", "x-lml/x-lmlpack"},
    {".log", "text/plain"},
    {".lsf", "video/x-la-asf"},
    {".lsx", "video/x-la-asf"},
    {".lzh", "application/octet-stream"},
    {".m13", "application/x-msmediaview"},
    {".m14", "application/x-msmediaview"},
    {".m15", "audio/x-mod"},
    {".m3u", "audio/x-mpegurl"},
    {".m3url", "audio/x-mpegurl"},
    {".m4a", "audio/mp4a-latm"},
    {".m4b", "audio/mp4a-latm"},
    {".m4p", "audio/mp4a-latm"},
    {".m4u", "video/vnd.mpegurl"},
    {".m4v", "video/x-m4v"},
    {".ma1", "audio/ma1"},
    {".ma2", "audio/ma2"},
    {".ma3", "audio/ma3"},
    {".ma5", "audio/ma5"},
    {".man", "application/x-troff-man"},
    {".map", "magnus-internal/imagemap"},
    {".mbd", "application/mbedlet"},
    {".mct", "application/x-mascot"},
    {".mdb", "application/x-msaccess"},
    {".mdz", "audio/x-mod"},
    {".me", "application/x-troff-me"},
    {".mel", "text/x-vmel"},
    {".mht", "message/rfc822"},
    {".mhtml", "message/rfc822"},
    {".mi", "application/x-mif"},
    {".mid", "audio/mid"},
    {".midi", "audio/midi"},
    {".mif", "application/x-mif"},
    {".mil", "image/x-cals"},
    {".mio", "audio/x-mio"},
    {".mmf", "application/x-skt-lbs"},
    {".mng", "video/x-mng"},
    {".mny", "application/x-msmoney"},
    {".moc", "application/x-mocha"},
    {".mocha", "application/x-mocha"},
    {".mod", "audio/x-mod"},
    {".mof", "application/x-yumekara"},
    {".mol", "chemical/x-mdl-molfile"},
    {".mop", "chemical/x-mopac-input"},
    {".mov", "video/quicktime"},
    {".movie", "video/x-sgi-movie"},
    {".mp2", "video/mpeg"},
    {".mp3", "audio/mpeg"},
    {".mp4", "video/mp4"},
    {".mpa", "video/mpeg"},
    {".mpc", "application/vnd.mpohun.certificate"},
    {".mpe", "video/mpeg"},
    {".mpeg", "video/mpeg"},
    {".mpg", "video/mpeg"},
    {".mpg4", "video/mp4"},
    {".mpga", "audio/mpeg"},
    {".mpn", "application/vnd.mophun.application"},
    {".mpp", "application/vnd.ms-project"},
    {".mps", "application/x-mapserver"},
    {".mpv2", "video/mpeg"},
    {".mrl", "text/x-mrml"},
    {".mrm", "application/x-mrm"},
    {".ms", "application/x-troff-ms"},
    {".msg", "application/vnd.ms-outlook"},
    {".mts", "application/metastream"},
    {".mtx", "application/metastream"},
    {".mtz", "application/metastream"},
    {".mvb", "application/x-msmediaview"},
    {".mzv", "application/metastream"},
    {".nar", "application/zip"},
    {".nbmp", "image/nbmp"},
    {".nc", "application/x-netcdf"},
    {".ndb", "x-lml/x-ndb"},
    {".ndwn", "application/ndwn"},
    {".nif", "application/x-nif"},
    {".nmz", "application/x-scream"},
    {".nokia-op-logo", "image/vnd.nok-oplogo-color"},
    {".npx", "application/x-netfpx"},
    {".nsnd", "audio/nsnd"},
    {".nva", "application/x-neva1"},
    {".nws", "message/rfc822"},
    {".oda", "application/oda"},
    {".ogg", "audio/ogg"},
    {".oom", "application/x-AtlasMate-Plugin"},
    {".p10", "application/pkcs10"},
    {".p12", "application/x-pkcs12"},
    {".p7b", "application/x-pkcs7-certificates"},
    {".p7c", "application/x-pkcs7-mime"},
    {".p7m", "application/x-pkcs7-mime"},
    {".p7r", "application/x-pkcs7-certreqresp"},
    {".p7s", "application/x-pkcs7-signature"},
    {".pac", "audio/x-pac"},
    {".pae", "audio/x-epac"},
    {".pan", "application/x-pan"},
    {".pbm", "image/x-portable-bitmap"},
    {".pcx", "image/x-pcx"},
    {".pda", "image/x-pda"},
    {".pdb", "chemical/x-pdb"},
    {".pdf", "application/pdf"},
    {".pfr", "application/font-tdpfr"},
    {".pfx", "application/x-pkcs12"},
    {".pgm", "image/x-portable-graymap"},
    {".pict", "image/x-pict"},
    {".pko", "application/ynd.ms-pkipko"},
    {".pm", "application/x-perl"},
    {".pma", "application/x-perfmon"},
    {".pmc", "application/x-perfmon"},
    {".pmd", "application/x-pmd"},
    {".pml", "application/x-perfmon"},
    {".pmr", "application/x-perfmon"},
    {".pmw", "application/x-perfmon"},
    {".png", "image/png"},
    {".pnm", "image/x-portable-anymap"},
    {".pnz", "image/png"},
    {".pot,", "application/vnd.ms-powerpoint"},
    {".ppm", "image/x-portable-pixmap"},
    {".pps", "application/vnd.ms-powerpoint"},
    {".ppt", "application/vnd.ms-powerpoint"},
    {".pptx", "application/"
              "vnd.openxmlformats-officedocument.presentationml.presentation"},
    {".pqf", "application/x-cprplayer"},
    {".pqi", "application/cprplayer"},
    {".prc", "application/x-prc"},
    {".prf", "application/pics-rules"},
    {".prop", "text/plain"},
    {".proxy", "application/x-ns-proxy-autoconfig"},
    {".ps", "application/postscript"},
    {".ptlk", "application/listenup"},
    {".pub", "application/x-mspublisher"},
    {".pvx", "video/x-pv-pvx"},
    {".qcp", "audio/vnd.qcelp"},
    {".qt", "video/quicktime"},
    {".qti", "image/x-quicktime"},
    {".qtif", "image/x-quicktime"},
    {".r3t", "text/vnd.rn-realtext3d"},
    {".ra", "audio/x-pn-realaudio"},
    {".ram", "audio/x-pn-realaudio"},
    {".rar", "application/octet-stream"},
    {".ras", "image/x-cmu-raster"},
    {".rc", "text/plain"},
    {".rdf", "application/rdf+xml"},
    {".rf", "image/vnd.rn-realflash"},
    {".rgb", "image/x-rgb"},
    {".rlf", "application/x-richlink"},
    {".rm", "audio/x-pn-realaudio"},
    {".rmf", "audio/x-rmf"},
    {".rmi", "audio/mid"},
    {".rmm", "audio/x-pn-realaudio"},
    {".rmvb", "audio/x-pn-realaudio"},
    {".rnx", "application/vnd.rn-realplayer"},
    {".roff", "application/x-troff"},
    {".rp", "image/vnd.rn-realpix"},
    {".rpm", "audio/x-pn-realaudio-plugin"},
    {".rt", "text/vnd.rn-realtext"},
    {".rte", "x-lml/x-gps"},
    {".rtf", "application/rtf"},
    {".rtg", "application/metastream"},
    {".rtx", "text/richtext"},
    {".rv", "video/vnd.rn-realvideo"},
    {".rwc", "application/x-rogerwilco"},
    {".s3m", "audio/x-mod"},
    {".s3z", "audio/x-mod"},
    {".sca", "application/x-supercard"},
    {".scd", "application/x-msschedule"},
    {".sct", "text/scriptlet"},
    {".sdf", "application/e-score"},
    {".sea", "application/x-stuffit"},
    {".setpay", "application/set-payment-initiation"},
    {".setreg", "application/set-registration-initiation"},
    {".sgm", "text/x-sgml"},
    {".sgml", "text/x-sgml"},
    {".sh", "application/x-sh"},
    {".shar", "application/x-shar"},
    {".shtml", "magnus-internal/parsed-html"},
    {".shw", "application/presentations"},
    {".si6", "image/si6"},
    {".si7", "image/vnd.stiwap.sis"},
    {".si9", "image/vnd.lgtwap.sis"},
    {".sis", "application/vnd.symbian.install"},
    {".sit", "application/x-stuffit"},
    {".skd", "application/x-Koan"},
    {".skm", "application/x-Koan"},
    {".skp", "application/x-Koan"},
    {".skt", "application/x-Koan"},
    {".slc", "application/x-salsa"},
    {".smd", "audio/x-smd"},
    {".smi", "application/smil"},
    {".smil", "application/smil"},
    {".smp", "application/studiom"},
    {".smz", "audio/x-smd"},
    {".snd", "audio/basic"},
    {".spc", "application/x-pkcs7-certificates"},
    {".spl", "application/futuresplash"},
    {".spr", "application/x-sprite"},
    {".sprite", "application/x-sprite"},
    {".sdp", "application/sdp"},
    {".spt", "application/x-spt"},
    {".src", "application/x-wais-source"},
    {".sst", "application/vnd.ms-pkicertstore"},
    {".stk", "application/hyperstudio"},
    {".stl", "application/vnd.ms-pkistl"},
    {".stm", "text/html"},
    {".svg", "image/svg+xml"},
    {".sv4cpio", "application/x-sv4cpio"},
    {".sv4crc", "application/x-sv4crc"},
    {".svf", "image/vnd"},
    {".eot", "application/vnd.ms-fontobject"},
    {".woff", "application/font-woff"},
    {".svh", "image/svh"},
    {".svr", "x-world/x-svr"},
    {".swf", "application/x-shockwave-flash"},
    {".swfl", "application/x-shockwave-flash"},
    {".t", "application/x-troff"},
    {".tad", "application/octet-stream"},
    {".talk", "text/x-speech"},
    {".tar", "application/x-tar"},
    {".taz", "application/x-tar"},
    {".tbp", "application/x-timbuktu"},
    {".tbt", "application/x-timbuktu"},
    {".tcl", "application/x-tcl"},
    {".tex", "application/x-tex"},
    {".texi", "application/x-texinfo"},
    {".texinfo", "application/x-texinfo"},
    {".tgz", "application/x-compressed"},
    {".thm", "application/vnd.eri.thm"},
    {".tif", "image/tiff"},
    {".tiff", "image/tiff"},
    {".tki", "application/x-tkined"},
    {".tkined", "application/x-tkined"},
    {".toc", "application/toc"},
    {".toy", "image/toy"},
    {".tr", "application/x-troff"},
    {".trk", "x-lml/x-gps"},
    {".trm", "application/x-msterminal"},
    {".tsi", "audio/tsplayer"},
    {".tsp", "application/dsptype"},
    {".tsv", "text/tab-separated-values"},
    {".ttf", "application/octet-stream"},
    {".ttz", "application/t-time"},
    {".txt", "text/plain"},
    {".uls", "text/iuls"},
    {".ult", "audio/x-mod"},
    {".ustar", "application/x-ustar"},
    {".uu", "application/x-uuencode"},
    {".uue", "application/x-uuencode"},
    {".vcd", "application/x-cdlink"},
    {".vcf", "text/x-vcard"},
    {".vdo", "video/vdo"},
    {".vib", "audio/vib"},
    {".viv", "video/vivo"},
    {".vivo", "video/vivo"},
    {".vmd", "application/vocaltec-media-desc"},
    {".vmf", "application/vocaltec-media-file"},
    {".vmi", "application/x-dreamcast-vms-info"},
    {".vms", "application/x-dreamcast-vms"},
    {".vox", "audio/voxware"},
    {".vqe", "audio/x-twinvq-plugin"},
    {".vqf", "audio/x-twinvq"},
    {".vql", "audio/x-twinvq"},
    {".vre", "x-world/x-vream"},
    {".vrml", "x-world/x-vrml"},
    {".vrt", "x-world/x-vrt"},
    {".vrw", "x-world/x-vream"},
    {".vts", "workbook/formulaone"},
    {".wav", "audio/x-wav"},
    {".wax", "audio/x-ms-wax"},
    {".wbmp", "image/vnd.wap.wbmp"},
    {".wcm", "application/vnd.ms-works"},
    {".wdb", "application/vnd.ms-works"},
    {".web", "application/vnd.xara"},
    {".wi", "image/wavelet"},
    {".wis", "application/x-InstallShield"},
    {".wks", "application/vnd.ms-works"},
    {".wm", "video/x-ms-wm"},
    {".wma", "audio/x-ms-wma"},
    {".wmd", "application/x-ms-wmd"},
    {".wmf", "application/x-msmetafile"},
    {".wml", "text/vnd.wap.wml"},
    {".wmlc", "application/vnd.wap.wmlc"},
    {".wmls", "text/vnd.wap.wmlscript"},
    {".wmlsc", "application/vnd.wap.wmlscriptc"},
    {".wmlscript", "text/vnd.wap.wmlscript"},
    {".wmv", "audio/x-ms-wmv"},
    {".wmx", "video/x-ms-wmx"},
    {".wmz", "application/x-ms-wmz"},
    {".wpng", "image/x-up-wpng"},
    {".wps", "application/vnd.ms-works"},
    {".wpt", "x-lml/x-gps"},
    {".wri", "application/x-mswrite"},
    {".wrl", "x-world/x-vrml"},
    {".wrz", "x-world/x-vrml"},
    {".ws", "text/vnd.wap.wmlscript"},
    {".wsc", "application/vnd.wap.wmlscriptc"},
    {".wv", "video/wavelet"},
    {".wvx", "video/x-ms-wvx"},
    {".wxl", "application/x-wxl"},
    {".x-gzip", "application/x-gzip"},
    {".xaf", "x-world/x-vrml"},
    {".xar", "application/vnd.xara"},
    {".xbm", "image/x-xbitmap"},
    {".xdm", "application/x-xdma"},
    {".xdma", "application/x-xdma"},
    {".xdw", "application/vnd.fujixerox.docuworks"},
    {".xht", "application/xhtml+xml"},
    {".xhtm", "application/xhtml+xml"},
    {".xhtml", "application/xhtml+xml"},
    {".xla", "application/vnd.ms-excel"},
    {".xlc", "application/vnd.ms-excel"},
    {".xll", "application/x-excel"},
    {".xlm", "application/vnd.ms-excel"},
    {".xls", "application/vnd.ms-excel"},
    {".xlsx",
     "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
    {".xlt", "application/vnd.ms-excel"},
    {".xlw", "application/vnd.ms-excel"},
    {".xm", "audio/x-mod"},
    {".xml", "text/plain"},
    {".xml", "application/xml"},
    {".xmz", "audio/x-mod"},
    {".xof", "x-world/x-vrml"},
    {".xpi", "application/x-xpinstall"},
    {".xpm", "image/x-xpixmap"},
    {".xsit", "text/xml"},
    {".xsl", "text/xml"},
    {".xul", "text/xul"},
    {".xwd", "image/x-xwindowdump"},
    {".xyz", "chemical/x-pdb"},
    {".yz1", "application/x-yz1"},
    {".z", "application/x-compress"},
    {".zac", "application/x-zaurus-zac"},
    {".zip", "application/zip"},
    {".json", "application/json"},
    {".7z", "application/x-7z-compressed"},
};

static std::map<cinatra::req_content_type, std::string_view> res_mime_map = {
    {cinatra::req_content_type::html, "text/html; charset=UTF-8"},
    {cinatra::req_content_type::json, "application/json; charset=UTF-8"},
    {cinatra::req_content_type::string, "text/plain; charset=UTF-8"},
    {cinatra::req_content_type::multipart, "multipart/form-data; boundary="}};

inline std::string_view get_mime_type(std::string_view extension) {
  auto it = mime_map.find(std::string(extension.data(), extension.size()));
  if (it == mime_map.end()) {
    return "application/octet-stream";
  }

  return it->second;
}
} // namespace cinatra
